﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.bingt
    病态方程组
    参数 a: a[n][n]系数矩阵
    参数 n: 
    参数 b: b[n]常数向量
    参数 eps: 精度要求
    参数 x: x[n]返回解向量。若系数矩阵奇异，返回0向量。
    参数 inter: 最大校正次数,10
    返回值 正常则返回非0标志值。若系数矩阵奇异或校正达到10次还不满足精度要求，则显示错误信息，并返回0标志值。
    */

    public static string drive_bingt()
    {
        int i, j;
        const int N = 5;
        double[,] a = new double[N, N];
        double[] r = new double[N];
        double[] x = new double[N];
        double[] b = new double[N] {
            1.0, 0.0, 0.0, 0.0, 1.0
        };

        for (i = 0; i < N; i++)
            for (j = 0; j < N; j++)
                a[i, j] = 1.0 / (1.0 + i + j);

        string rs = "";
        rs += gl.html_table("系数矩阵 A:", a);
        rs += gl.html_table("常数向量 B:", b);

        i = gl.bingt(a, N, b, 0.00000001, x, 10);
        if (i == 0) return "error: 0";

        rs += gl.html_table("解向量 X:", x);

        for (i = 0; i < N; i++)
        {
            r[i] = 0;
            for (j = 0; j < N; j++)
                r[i] = r[i] + a[i, j] * x[j];
            r[i] = b[i] - r[i];
        }

        rs += gl.html_table("残向量 R:", r);

        return rs;
    }
}